Hodorishe, ну во-первых, сделаем сохранение, прежде, чем менять. Во-вторых, выбираем ландшафт ТЦ, ставим галочку на нестандартности, удаляем всё, кроме того, что не удаляется (склоны), копируем из глуши все копируемые тайлы, расставляя их в том же порядке, что и были. Проверяем. У меня изменились только склоны.
Ну разве что с бездной проблемка возникла, ибо она и как склон, и как тайл.
Если еще немного покопатса на сайте в разделе декораций - можно нагрести кучу добра!
И вобще мой вам совет - научитесь минимальному моделингу: сможете клепать такие вещи за 3 минуты на коленке с необходимым вам видом, формой и текстурой.
Sucsonius, через скилы реализовать покупку/продажу юнитов(все действия описывать триггерно, а инфу показывать в мультибоарде)
ещё можно отдать дамми герою приказ на покупку и таким образом уменьшать
можно создать кучу зданий с разным количеством двенадцатого юнита и при необходимости сменить количество удалять здание и создавать новое возвращая выделение и количество юнитов с 1 по 11
можно сделать полноэкранную таверну с помощью дгуи
имхо последнее лучше всего будет Sucsonius:
который обходит данную проблему
костыли не обходят проблему
они извращают всё таким образом что проблема не заметна на фоне этих костылей
если тебе надо обойти проблему то пиши новый вар3
Sucsonius, через скилы реализовать покупку/продажу юнитов(все действия описывать триггерно, а инфу показывать в мультибоарде)
ещё можно отдать дамми герою приказ на покупку и таким образом уменьшать
можно создать кучу зданий с разным количеством двенадцатого юнита и при необходимости сменить количество удалять здание и создавать новое возвращая выделение и количество юнитов с 1 по 11
можно сделать полноэкранную таверну с помощью дгуи
имхо последнее лучше всего будет Sucsonius:
который обходит данную проблему
костыли не обходят проблему
они извращают всё таким образом что проблема не заметна на фоне этих костылей
если тебе надо обойти проблему то пиши новый вар3
void - это nothing то есть ничего не возвращает функция, а саму функции называют doTheThing, а unit u - аргументы функции, мануалы про cjass почитай (хотя я тоже соглашусь, что написано очень плохо в мануалах. Нужно попробовать немного самим пописать коды)
можно представить как (если хорошо понимаешь jass)
function doTheThing takes unit u returns nothing
... //что-то делаешь с юнитом u (берем аргумент функции - unit u)
endfunction
GetMyUnit - такой не существует, видимо Док имеет в виду подставить свою переменную
пример
например составил пример функции - определить уровень абилы юнита. Функция называется LV, u - юнит, id - целое число, равкод абилы. Возвращает целое число (уровень абилы).
function LV takes unit u, integer id returns integer
return GetUnitAbilityLevel(u, id)
endfunction
'A000' - равкод абилы
local integer lv = LV(GetTriggerUnit(), 'A000') //узнаем уровень героя
Урон настраивается через уровень способности, или как было сказано unit - damage target
команда для использования нестандартной способности берется от той способности, на основе которой ты её сделал, и если это цепь тралла - Unit - issue order with targetign a unit - orc - chain lighting
И в правду рак мозга...
Статьи почитать не судьба? Некоторые предметные способности не повышают уровень - точнее эффект от повышения уровня не изменяется, посему делают 5 (100500) способностей с разными бонусами и выдаются юниту в нужный момент.
Способность маски соби - повышает базовый реген маны и бонус от интеллекта, так что крипам с 0 манарегена эта способность ничего не добавит.
Собственные попытки в студию, что не получается?
Напомним - ЭТО НЕ СТОЛ ЗАКАЗОВ, здесь задают вопросы про реализацию тех или иных вопросов, спрашивают про ошибки, оптмизацию, отдельные функции. Я не увидел в вашем вопросе ничего кроме невнятного описания механики способности, " вокргу кого то там огненные столбы возникают, и еще порча"...
тебе нужен не уровень героя, а уровень способности
здоровье нужно устанавливать на текущее здоровье триггеринг юнит + нужное число + уровень способности твоей абилы умножить на нужное число (там сам смотри, сколько она дамажит)
убери вейт, нормальный таймер ты все равно сейчас не раскуришь, пусть хилит мгновенно после каста, чуть некрасиво, зато относительно нормальный код получится
//////////
в идеале вообще любой такой отхил элементарно делается на вешание событий получения урона кому надо и при них и отхил наносящего, там как раз и отхилится именно на сколько нанёс, а не как у тебя, но это ты имхо опять же еще не раскуришь
Уже решил.для тех кто будет искать данный вопрос - можно использовать свиток регенерации(Раса:люди),он игнорирует сколько у вас хп и имеет длительность.
Создаешь триггер, в событие ставишь период и в действия - изменение переменной. Хз в чём тут может быть трабл. Событие - "время - periodic", Действие - "set variable". Или как-то так. Первое найти легко, там список всего ничего, а второе так и вовсе четвертая строчка (если не ошибаюсь).
Совсем забыл - xgm.guru/p/wc3/articles
Хеш-таблица в которую ты будешь запоминать всех кто сел на корабль или группа. Короче, любое место в котором можно хранить несколько юнитов. При погружении на корабль, запоминаешь юнита. Удаляешь его из игры. Потом в нужный момент моздаешь такого же.Или просто выгружаешь и скрываешь, в нужный момент потом просто передвинуть и показать этого юнита. Вот и все...
Но для начала переведи текстуру в формат jpg\png, далее волшебной палочкой двойным щелчком повыделяй нужный\ нужные тебе сегменты для перекраски. Залей их нужным тебе цветом. Сохрани в png. Экспортируй png => blp.
И всё!
Всё что тебе понадобится: скаченный BLP laboratory, war3ModelEditor
и pixlr.com/editor/?loc=ru?loc=ru
DazzleFirst, возможно ли как то создать локальный триггер при применении способности и уничтожить обратно?
ведь обычно локальные триггеры как правило при применении способности создаются в инициализации карты...
нет нужды выделять еще один триггер (помимо отлова) на заклинание, если оно не слишком громоздкое в плане исполнения.
Как сообщает товарищ nvc123:
Zeuz, лучше не использовать много триггеров
вообще нету такой ситуации в которой надо много триггеров
стоит обратить на это внимание. Везде и всюду есть свои нюансы которые нужно учитывать. Если не выполнить задуманное с помощью одного триггера, то делаем два.
Megacomp, это не джасс а вджасс
проверь включен ли у тебя джассхелпер
так же не забывай что перед тем как нажать "проверка карты" карту нужно сохранить
Ну можно координаты камеры игрока. Но там нужен синк в кеше, чтобы небыло десинха, а это уже ни ГУИ.
Вот примитивный пример получение и сохранения координат камеры игрока:
scope PlayerRelated initializer InitPlayers
globals
force AllPlayers = null
trigger gg_trg_PlayerLeft = null
playerevent bj_enumPlayerEventId = null
player array PL
gamecache data
endglobals
function TriggerRegisterPlayerEventEnum takes nothing returns nothing
call TriggerRegisterPlayerEvent( bj_destInRegionDiesTrig, GetEnumPlayer( ), bj_enumPlayerEventId )
endfunction
function TriggerRegisterForceEvent takes trigger trig, force forforce, playerevent id returns nothing
set bj_destInRegionDiesTrig = trig
set bj_enumPlayerEventId = id
call ForForce( forforce, function TriggerRegisterPlayerEventEnum )
endfunction
function Trig_Player_Left_Actions takes nothing returns nothing
call ForceRemovePlayer( AllPlayers, GetTriggerPlayer( ) )
endfunction
function IsSlotPlayer takes player pl returns boolean
return GetPlayerSlotState( pl ) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController( pl ) == MAP_CONTROL_USER
endfunction
function InitPlayers takes nothing returns nothing
set AllPlayers = CreateForce( )
set gg_trg_PlayerLeft = CreateTrigger( )
set data = InitGameCache( "Data.w3v" )
set bj_forLoopAIndex = 0
loop
exitwhen bj_forLoopAIndex > bj_MAX_PLAYERS
set PL[bj_forLoopAIndex] = Player( bj_forLoopAIndex )
if IsSlotPlayer( PL[bj_forLoopAIndex] ) then
call ForceAddPlayer( AllPlayers, PL[bj_forLoopAIndex] )
call TriggerRegisterPlayerEvent( gg_trg_PlayerLeft, PL[bj_forLoopAIndex] , EVENT_PLAYER_LEAVE )
endif
set bj_forLoopAIndex = bj_forLoopAIndex + 1
endloop
call TriggerAddAction( gg_trg_PlayerLeft, function Trig_Player_Left_Actions )
endfunction
endscope
function Trig_Get_Player_Screen_Cord_Conditions takes nothing returns boolean
return true
endfunction
function Trig_Get_Player_Screen_Cord_Actions takes nothing returns nothing
local player pl = GetTriggerPlayer( )
local real dx = 0.00
local real dy = 0.00
if GetLocalPlayer( ) == pl then
set dx = GetCameraEyePositionX( )
set dy = GetCameraEyePositionY( )
else
set dx = 0.00
set dy = 0.00
endif
call StoreReal( data, "Cord", "X", dx )
call StoreReal( data, "Cord", "Y", dy )
call TriggerSyncStart( )
if GetLocalPlayer( ) == pl then
call SyncStoredReal( data, "Cord", "X" )
call SyncStoredReal( data, "Cord", "Y" )
endif
call TriggerSleepAction( 2.00 )
call TriggerSyncReady( )
set dx = GetStoredReal( data, "Cord", "X" )
set dy = GetStoredReal( data, "Cord", "Y" )
// далее делаем с коорданатами камеры что хочется!
call PingMinimapEx( dx, dy, 3.00, 255, 255, 255, true )
endfunction
//===========================================================================
function InitTrig_Get_Player_Screen_Cord takes nothing returns nothing
set gg_trg_Get_Player_Screen_Cord = CreateTrigger( )
set bj_forLoopAIndex = 0
loop
exitwhen bj_forLoopAIndex > bj_MAX_PLAYERS
if IsPlayerInForce( PL[bj_forLoopAIndex], AllPlayers ) then
call TriggerRegisterPlayerChatEvent( gg_trg_Get_Player_Screen_Cord, PL[bj_forLoopAIndex], "-GetCord", true )
endif
set bj_forLoopAIndex = bj_forLoopAIndex + 1
endloop
call TriggerAddCondition( gg_trg_Get_Player_Screen_Cord, Condition( function Trig_Get_Player_Screen_Cord_Conditions ) )
call TriggerAddAction( gg_trg_Get_Player_Screen_Cord, function Trig_Get_Player_Screen_Cord_Actions )
endfunction
ScopteRectuS, Переменные инициализируются при инициализации карты, она же вроде как глобальная udg_HeroGFL_owner. Или в коде карты насильно инициализировать?
Они же не локалки ScopteRectuS, м, реально null возвращает боевая единицы. Смешно. Окей: И как ему определить созданную во время игры боевую единицу?
Это из-за физического размера выбираемых воинов.
Если хотите сделать способность, которая будет работать также, как и стандартные, то при выборе воинов в качестве радиуса указываете нужный радиус + максимально возможный физический размер воинов на карте.
// Если перебор воинов идёт через цикл:
call GroupEnumUnitsInRange( group, x, y, SPELL_RADIUS + MAX_COLLIZION_SIZE, boolexpr )
loop
// ...
set enumUnit = FirstOfGroup( group )
// ...
if IsUnitEnemy( enumUnit, player ) and IsUnitInRangeXY( enumUnit, x, y, SPELL_RADIUS ) then
call DoSomething( )
endif
// ...
endloop
Как показано выше, с помощью функции IsUnitInRange( ) мы можем отсеять воинов, которые не попали в радиус действия способности, но были выбраны в группу из-за того, что мы указали в функции GroupEnumUnitsInRange( ) радиус чуть больше нужного нам.
да, сейчас вообще обратил внимание что текстуры идущие в комплекте не воспринимаются почему-то, а именно "Shield.blp".
Все равно проблема не решилась, вроде бы смог заменить текстуру, которую не видел но варик не воспринимает модель.
1
Для отображения интерфейса необходима только модель, не нужно для ее роботы новых текстур.
ВарКрафт ссылается на модели для отображения гемплея, а в свою очередь модели ссылаются на текстуры.
Хитрость в том что можна создавать 15 моделей с одинаковыми текстурами.
Trickster, ну так будет 100р?
В карте испоганен заголовок и хешьтаблица и удалены данные об обьектах, поэтому она не открывается ничем кроме зезулы, но зезула не дает возможность редактировать файлы. Ну собственно я это дело снял, могу восстановить открываемость в редакторе..
Первая рпгшка со слабой hex защитой, повреждение заголовка, спокойно открывается что ладиком что RMPQ, код смесь гуи + vjass систем, данные о войсках на карте и триггерах удалены, в коде не сжаты имена (автор не знает про тулы векса), вторая карта тоже самое.
Сломать их раз плюнуть, рассказывать как и зачем я не буду, инфы пруд пруди.
>> IssueInstantTargetOrder: The only use of this function is to make units give items from their inventory to other units. The order in this case would be smart, the target widget is the item and the instant target widget is the target unit. The ordered unit will then move towards the target unit and hand the item over.
>>These natives have terribly confusing names, but I've heard that they are for manipulating items. I.e. Give this item (one widget argument) to this unit (another widget argument) or drop it at this point. I don't know which argument is the item and which is the target unit though.
гугл помог, а память подвела, покупка через Neutral* приказы делается
852000 (skillmenu): Приказ (без указания цели), при выполнении которого открывается меню навыков героев. Если же триггерно заставить выполнить этот приказ обычную боевую единицу, то исчезнет ее карта команд, которая возвратится, если выбрать боевую единицу.
851994 (buildmenu): Приказ (без указания цели), открывающий меню строительства воина, способного возводить здания.
Но эти приказы 852000 и 851994 не ловятся при нажатии, эти приказы нужно чтобы отдать боевой единице открыть меню скилов или строительства, а вот отловить не получится.
Число зависит от слота инвентаря, в котором лежит использованный предмет
Кстати не знаю как у других, а у меня оглушенный юнит игнорирует приказы и триггер их не ловит
Интересно зачем? Вы в курсе что это номер по которому движок ищит в списке что ему делать а еше куда рисовать кулдаун и прочее? Есть ограниченное число приказов и вся нужны, изменять ид приказа абилкам - бесполезно, исключение канал и поставка ресурсов - там есть отдельный обработчик, который смотрит что база канал а после уже идет все остальное. Каналу id приказа меняем из соображения кулдауна на панели приказа, остальное, другое применение у id приказа нет.
Лимит операций, обычно это беда настигает заядлых гуишников.
На jass обычно нету таких проблем.
Создайте таймер с периодом .00 сек и запускайте им функции инициализации триггеров.
функция типа InitTrig_Имя триггера - это функция инициализации триггера, она вызывается из функции InitCustomTriggers, но если этих вызовов очень много то функция упирается в лимит операций и поток завершается так и не создав все триггеры.
Pick every unit in range [250] matching condition [бафф спелла]
Всё что находится внутри данного блока произойдёт столько раз, сколько воинов находится внутри выбранной группы. Обратиться к воину можно через Picked Unit ( GetEnumUnit( ) ). Если Вам нужно добавить событие на смерть именно этих воинов, то прямо здесь внутри блока добавляете их в событие триггера, выбрав их через Picked Unit, или сохраняете их в переменные.
Также можно не сохранять каждого воина, а занести их в отдельную группу. А вместо проверки:
Как вариант, сделать так, что бы модель была разбита на множество текстур которые раскиданы по самым дурацким путям. Ни какой картодел не будет вытаскивать такую модель, ни за что.
quq_CCCP, а можно поподробнее? И это защитит карту от инжекта?
Подробно - это сделай за меня?
Суть:
call BJDebugMsg( I2Sx( 100500 ) )
Выдаст разные значения в депротектнутой и нормальной картах, пока это теория но возьмите и проверьте. I2Sx - фольклорная функция ретурн бага, суть преобразует хеш от строки в строку. именно хеш а не инт. т.е адрес в таблице строк на строку. вот RetunrBug ( www.hiveworkshop.com/threads/accessing-memory-from-the-script-it... ) функция в либе Typecast - I2SH
Ну кароче проверил:
function Trig_J_Test_Actions takes nothing returns nothing
local integer i = 486
local string str = null
set str = S2S( I2SH( i ) )
call BJDebugMsg( str )
set str = null
endfunction
//===========================================================================
function InitTrig_J_Test takes nothing returns nothing
set gg_trg_J_Test = CreateTrigger( )
call TriggerRegisterPlayerEventEndCinematic( gg_trg_J_Test, Player(0) )
call TriggerAddAction( gg_trg_J_Test, function Trig_J_Test_Actions )
endfunction
При добавлении, удалении 3 функций сменяется строка по этому адресу, самое главное найти последнюю строку (ну или как я от балды ввел число) хотя я не уверен что прокатит с числом от балды, нужно найти последнюю строку на момент загрузки карты и смотреть её адрес, а после смотреть что будет записано по этому адресу в таблице строк.
Karp, Ой способов защиты 100500, щяс есть мемхак, я уже выкладывал пример как проверить вводились ли в код карты измненения.
Так же есть возможность писать код карты байткодами, которые внезапно низя прочитать или перевести в JASS это внутренние инстркции JASS машины. Но это достаточно сложно. Так же Можно загружать свои ДЛЛ, а это дает полный контроль над картой, можно зашифровать и сжать данные в архиве хер знает какими алгоритмами которые никогда не видел варкравт, а при загрузке срипта вызывать Дллку которая бы и расшифровывала это дело и вызывала функцию чтения архива + проверяла контрольную сумму архива (вроде в мемхаке была эта функция), контрульная сумма не та - выгружаем из ДЛЛ вирус, чтонить на подобии шифровальщиков. И читерам уже не до карты и варкравта в целом...
Это не для гуи новичков, придется долго морщить лоб и писать карту на jass + малость в с++ шарить.
аура есть аура, она не будет распространится на атаку юнита, используйте орб эффект, к примеру сферу замедления чтобы юнит при атаке накладывал на врага некоторый эффект.
ВНИМАНИЕ большинство орбов не складываются, поэтому если для вас это критично то скачиваем систему отлова физ урона и делаем пассивку полностью триггерно.
Сам делаю такую систему для второго этажа - делаеш тригер со своей инициализацией и потом через действие первращаеш юнита в летающего и повышаеш высоту полета. Если я говорю что-нибуть не так, то сам хотел бы посмотреть на пример других людей.
Юнитов поднимает тогда же, когда и опускает, потому что я удаляю их из DedG[3], но забываю удалить из группы снарядов, таким образом, к тем кто попал под падение, уже навечно задействован акт снарядов(опускание), пока они в DedG[3]
Ну это сплеш, на тип урона не проверял, область настраивается и кол-во урона, оно же урон по аое.
Не все, а орбы предметов, орб может включить вторую атаку героя, только если она изначально выключена и есть. По этой причине владельцы орбов порой считаются юнитами дальнего боя, что разумеется не так (вторая атака всегда атака дальнего боя у всех дефолтных героев в варкравте, особо вторую атаку никто не настраивает.)
В орбах вроде сферы огня нету ничего интересного или полезного, лучше делать руками те эффекты которые они дают.
адрес будет переиспользован, когда объект больше в игре не существует. хендл при этом может и не освободиться - т.е. прошлый останется навсегда "занятым". Реальный адрес никакой роли при этом не играет. RemoveUnit заставляет движок забыть о юните, что иногда чревато, лучше убивать, а потом таймером Remove, либо просто позволить ему разложиться (с тем же эффектом, но стандартная работа игры)
спойлер - хештаблицы медленнее в сравнении с доступом по массиву. как только ты дописываешь еще пару строк к массиву (т.к. тебе надо вычислить ключ), внезапно хт становится быстрее. так что не мудри
нет ничего быстрее нативок. а каждая строка JASS-кода существенно замедляет работу. Экономия на спичках
» WarCraft 3 / Тип склона
» WarCraft 3 / Помогите найти ворота
» WarCraft 3 / Продажа юнита
» WarCraft 3 / Равкод 'A00\'
» WarCraft 3 / Продажа юнита
» WarCraft 3 / Условие технология
» WarCraft 3 / вопрос по удалению спецэффектов
» WarCraft 3 / Способность через триггер
» WarCraft 3 / Способность с целью - иллюзия
» WarCraft 3 / Как сделать стандартного воина героем?
» WarCraft 3 / Погрузить на корабль
» WarCraft 3 / Вопрос по моделированию
» WarCraft 3 / вопрос по моделированию
» WarCraft 3 / Глобальная карта
» WarCraft 3 / Область с воздействием на юнита
» WarCraft 3 / Что не так с моделями?
» WarCraft 3 / Интерфейс разных рас
» WarCraft 3 / как открыть карту в редакторе?
» WarCraft 3 / Id приказа
» WarCraft 3 / Про отряды
» WarCraft 3 / Немного про return
» WarCraft 3 / Направление триггерных спеллов
» WarCraft 3 / Карта и программы
» WarCraft 3 / Область воздействия
» WarCraft 3 / Хендл таймера